工作中經常會遇到需要在客戶端主機架站的情況,
如果客戶端只有一台主機,手動佈署或許不會花太多時間,
但若同時會有多台主機運行,可能就必須花上一整天,甚至好幾天的時間,
重複進行安裝軟體、調整系統參數這些瑣碎的動作,
不僅浪費掉許多時間,手動佈署站台主機也可能會有部分作業漏做的風險。
這時候可以寫一個bat檔,讓主機自動執行需要執行的動作,
這樣做的優點是:
以下用一個簡單的範例說明如何包出一個環境佈署用的bat檔。
本篇範例想要做到的項目如下:
Web
在開始之前,先準備好需要的軟體安裝檔,以及要複製到主機的檔案A.txt,
另外,我們通常都會希望這個bat檔可以重複使用,
所以首先需要宣告在不同的情況下,可能會變動的參數。
使用文字編輯器開啟一份新文件,先另存檔案為install.bat,接著填入以下參數:
::站台根目錄
set "WebPath=C:\Web"
::設定傳輸協定
set "Protocol=http"
::設定DOMAIN
set "DomainName=test.com.tw"
::設定WEB DOMAIN
set "WebUrl=%Protocol%:\\%DomainName%"
接下來依照想要做到的項目順序,將動作轉為cmd指令。
前面已經將站台根目錄設定為參數了,在參數前後加上"%參數%"
,該指令就可以使用參數值。
md "%WebPath%
搬移檔案前,先確保目前所在目錄是我們準備的A.txt及schedule.bat存放的目錄。
cd /D %~dp0
接著再把這兩個檔案放到C:\Web下,
其中,執行XCOPY時,如果目的地的檔案或資料夾不存在,
會要求我們選擇複製到目的地的是檔案或是資料夾,
這會中斷bat檔的執行,因此在XCOPY前先設定F
參數,預先指定複製到目的地的是一個檔案,
結尾的/Y
參數則代表不跳出是否要覆寫已存在的目的地檔案的提示。
echo F |XCOPY "A.txt" "%WebPath%\A.txt" /Y
echo F |XCOPY "schedule.bat" "%WebPath%\schedule.bat" /Y
若要複製到主機的是一個資料夾,在XCOPY前可以設定參數D
,指定複製到目的地的是資料夾。
echo D |XCOPY "testDirectory" "%WebPath%\testDirectory" /Y
為了不中斷bat檔的執行,使用/S
參數設定Notepad++在安靜模式下安裝。
npp.8.3.3.Installer.x64.exe /S
由於要批次開啟多個Windows功能,這裡另外使用一個powershell檔InstallIIS.ps1
,
新增一個新文件,先另存檔案為InstallIIS.ps1
後,編寫以下指令:
#以系統管理員身分執行powershell
param([switch]$Elevated)
function Test-Admin {
$currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
$currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
if ((Test-Admin) -eq $false) {
if ($elevated) {
# tried to elevate, did not work, aborting
} else {
Start-Process powershell.exe -Verb RunAs -ArgumentList ('-noprofile -noexit -file "{0}" -elevated' -f ($myinvocation.MyCommand.Definition))
}
exit
}
#根據需求開啟WINDOWS功能
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerRole -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServer -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-CommonHttpFeatures -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpErrors -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ApplicationDevelopment -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-NetFxExtensibility45 -ALL
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HealthAndDiagnostics -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpLogging -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-LoggingLibraries -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-RequestMonitor -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpTracing -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-Security -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-RequestFiltering -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-Performance -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServerManagementTools -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-StaticContent -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-DefaultDocument -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-DirectoryBrowsing -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebSockets -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ApplicationInit -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ASPNET45 -ALL
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ISAPIExtensions -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ISAPIFilter -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-HttpCompressionStatic -All
Enable-WindowsOptionalFeature -Online -FeatureName IIS-ManagementConsole -All
接著回到install.bat
補上使用PowerShell執行InstallIIS.ps1的指令。
PowerShell.exe -ExecutionPolicy UnRestricted -File InstallIIS.ps1
::=====建立應用程式集區=====
::建立應用程式集區TEST,並設定啟動模式為AlwaysRunning
%windir%\System32\inetsrv\APPCMD ADD APPPOOL /name:TEST /managedRuntimeVersion:"v4.0" /startMode:AlwaysRunning
::=====建立應用程式目錄=====
::變更IIS根目錄為C:\Web,應用程式集區為TEST
%windir%\System32\inetsrv\APPCMD SET SITE /site.name:"Default Web Site" /[path='/'].applicationPool:TEST -[path='/'].[path='/'].physicalPath:"%WebPath%" -[path='/'].preloadEnabled:true
把站台的DomainName mapping到本機localhost。
find /i "%DomainName%" %WINDIR%\system32\drivers\etc\hosts
if /i not %DomainName%==localhost (
if /i not %DomainName%==127.0.0.1 (
IF %errorlevel% equ 1 (
echo. >> %WINDIR%\system32\drivers\etc\hosts & echo 127.0.0.1 %DomainName% >> %WINDIR%\System32\drivers\etc\hosts
)
)
)
步驟2提到要將schedule.bat
搬移到C:\Web底下,這一個schedule.bat
為執行排程的指令檔,
在schedule.bat
裡面編寫的是IIS Restart的指令:
iisreset /restart
回到install.bat
中編寫執行排程的指令:
schtasks /Create /TR %WebPath%\schedule.bat /ST 23:30 /TN IIS_RESTART /SC DAILY /RU system
這樣就完成一個自動佈署的bat檔了!
最後記得檢查一下所有需要的程式和文件都放在同一個資料夾
要執行自動佈署bat檔時,使用系統管理員身分開啟命令提示字元,
然後cd到setup資料夾,執行install.bat就可以囉!